logo头像
Snippet 博客主题

Scala学习之路 (七)Scala的柯里化及其应用

** Scala学习之路 (七)Scala的柯里化及其应用:** <Excerpt in index | 首页摘要>

​ Scala学习之路 (七)Scala的柯里化及其应用

<The rest of contents | 余下全文>

一、概念

柯里化(currying, 以逻辑学家Haskell Brooks Curry的名字命名)指的是将原来接受两个参数的函数变成新的接受一个参数的函数的过程。新的函数返回一个以原有第二个参数作为参数的函数。 在Scala中方法和函数有细微的差别,通常编译器会自动完成方法到函数的转换。

二、Scala中柯里化的形式

Scala中柯里化方法的定义形式和普通方法类似,区别在于柯里化方法拥有多组参数列表,每组参数用圆括号括起来,例如:

img

mysum方法拥有两组参数,分别是(x: Int)和(y: Int)。
mysum方法对应的柯里化函数类型是:

1
Int => Int = >Int

柯里化函数的类型声明是右结合的,即上面的类型等价于:

1
Int => (Int = >Int)

表明该函数若只接受一个Int参数,则返回一个Int => Int类型的函数,这也和柯里化的过程相吻合。

三、示例

上面的代码定义了一个柯里化方法,在Scala中可以直接操纵函数,但是不能直接操纵方法,所以在使用柯里化方法前,需要将其转换成柯里化函数。最简单的方式是使用编译器提供的语法糖:

img

使用Scala中的部分应用函数(partially applied function)技巧也可以实现转换,但是请注意转后后得到的并不是柯里化函数,而是一个接受两个(而不是两组)参数的普通函数

img

传入一个参数

img

即一个接受一个Int参数返回Int类型的函数。 继续传入第2个参数:

img

两组参数都已经传入,返回一个Int类型结果